package com.mashibing.strategy.filter;

import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.model.StandardSubmit;
import com.mashibing.strategy.client.BeaconCacheClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author SNA
 * @date 2025/8/25
 * @Description  策略模块校验链的执行
 **/
@Component
@Slf4j
public class CheckFilterContext {

    /**
     * stringStrategyFilterMap 的构成：
     *   这是一个由Spring自动装配的Map，包含了所有实现了 StrategyFilter 接口的Bean
     *   key是Bean的名称（即@Service注解中的value值），value是对应的Bean实例
     *   例如，之前看到的 PhaseStrategyFilter 因为使用了 @Service(value = "phase")，所以会以"phase"作为key存储在Map中
     */
    // 泛型注入，拿到所有的校验信息
    @Autowired
    private Map<String, StrategyFilter> stringStrategyFilterMap;

    // 注入BeaconCacheClient
    @Autowired
    private BeaconCacheClient beaconCacheClient;

    // client_business中的clientFilters字段：策略校验顺序动态实现规则
    private final String CLIENT_FILTERS = "clientFilters";

    /**
     * 当前strategy方法用于管理校验链的顺序
     * @param submit
     */
    public void strategy(StandardSubmit submit) {
        //1、基于Redis获取客户对应的校验信息
        String filter = beaconCacheClient.hget(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), CLIENT_FILTERS);

        //2、健壮性校验后，基于逗号分隔遍历
        String[] filterArray = filter.split(",");
        if (filter != null && filterArray.length > 0) {
            // 到这，filterArray不为null，并且有数据
            for (String strategy : filterArray) {
                //3、遍历时，从stringStrategyFilterMap中获取到需要执行的校验信息，执行
                StrategyFilter strategyFilter = stringStrategyFilterMap.get(strategy);
                if (strategyFilter != null) {
                    strategyFilter.strategy(submit);
                }
            }
        }
    }
}
